package com.ronz.linkedlist;

import com.ronz.linkedlist.util.HeroNode;
import com.ronz.linkedlist.util.NodeUtil;

import java.util.Stack;

/**
 * @Description 将链表逆序打印
 *              方案一：直接使用 No3 代码的方法，先将链表反转，然后打印
 *              方案二：使用栈，根据栈先进后出的特性，将链表各个结点先入栈，然后逐个出栈打印
 *              方案三：使用递归
 * @Author Ronz
 * @Date 2020/12/23 11:30
 * @Version 1.0
 */
public class No4_PenTest_SingleLinkedList {

    public static void main(String[] args) {
        HeroNode head = NodeUtil.getTestList();

        printReverse_2(head);

        // HeroNode cur = head.next;
        // printReverse_3(cur);
    }

    /**
     * @Description 方案二：使用栈来逆序打印结点
     * @Param [head] 头结点
     * @return void
     */
    public static void printReverse_2(HeroNode head){
        Stack<HeroNode> nodeStack = new Stack<>();
        // 去除头结点
        HeroNode cur = head.next;
        // 结点入栈
        while (cur != null){
            nodeStack.push(cur);
            cur = cur.next;
        }
        // 结点出栈并打印
        while (nodeStack.size() > 0){
            System.out.println(nodeStack.pop());
        }

    }

    /**
     * @Description 方案三：使用递归打印结点
     * @Param [node] 链表的第一个结点，即 head.next
     * @return void
     */
    public static void printReverse_3(HeroNode node){
        if (node.next != null){
            printReverse_3(node.next);
        }
        System.out.println(node);
    }
}
